1、题干
给出第一个词 first
和第二个词 second
,考虑在某些文本 text
中可能以 "first second third"
形式出现的情况,其中 second
紧随 first
出现,third
紧随 second
出现。
对于每种这样的情况,将第三个词 "third
" 添加到答案中,并返回答案。
示例 1:
输入:text = "alice is a good girl she is a good student", first = "a", second = "good"
输出:["girl","student"]
示例 2:
输入:text = "we will we will rock you", first = "we", second = "will"
输出:["we","rock"]
提示:
1 <= text.length <= 1000
text
由小写英文字母和空格组成text
中的所有单词之间都由 单个空格字符 分隔1 <= first.length, second.length <= 10
first
和second
由小写英文字母组成
2、解题思路
- 正则:使用正则表达式匹配满足条件的单词即可
- 代码最少,但要注意处理好单词边界(
\b
)
- 代码最少,但要注意处理好单词边界(
- 拆分数组:将字符串按空格拆分为字符串数组,遍历并判断连续的两个单词是否符合条件即可
- 逻辑简单易懂,坑比较少
- 直接遍历:以空格为标识,判断已遍历的单词数量、以及是否跟
first
second
相等即可- 代码略多,边界情况较多,容易踩坑
3、代码1 - 正则
var findOcurrences = function (text, first, second) {
return text.match(new RegExp(`(?<=\\b${first} ${second} )[a-z]+`, 'g')) || [];
};
4、代码2 - 拆分数组
var findOcurrences = function (text, first, second) {
const words = text.split(' ');
return words.reduce((acc, cur, i) => {
if (cur === second && words[i - 1] === first && words[i + 1]) acc.push(words[i + 1]);
return acc;
}, []);
};
5、代码3 - 直接遍历
var findOcurrences = function (text, first, second) {
let word = '', found = 0, res = [];
for (let i = 0; i < text.length; i++) {
if (text[i] !== ' ') {
word += text[i];
if (i < text.length - 1) continue;
}
if (found === 2) res.push(word), found = word === second && word === first ? 2 : (word === first ? 1 : 0);
else if (found === 1) found = word === second ? 2 : (word === first ? 1 : 0);
else if (found === 0) found = word === first ? 1 : 0;
word = '';
}
return res;
};